package com.wtgroup.demo.mianshi.线程.d04_线程池;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @author dafei
 * @version 0.1
 * @date 2021/4/18 21:14
 */
public class D3_ThreadNums {

    /**
     * Q: 线程池. 核心8, 上限16, 开10个, 会有多少个线程; 开16个呢?
     */

    public static void main(String[] args) {
        // // cache 缓存
        // // 缓存线程池
        // Executors.newCachedThreadPool();
        // // 固定
        Executors.newFixedThreadPool(3);
        // // 定时任务
        // Executors.newScheduledThreadPool();
        // // single 1  Singleton 单例模式
        // Executors.newSingleThreadExecutor();


        ThreadPoolExecutor pool = new ThreadPoolExecutor(
                2, // corePoolSize
                10, // maximumPoolSize
                60, // keepAliveTime
                TimeUnit.SECONDS, // 时间单位
                new ArrayBlockingQueue<>(4), // 阻塞队列
                Executors.defaultThreadFactory(), // 线程工厂, 产生线程的方式, 线程组,线程名,is deamon,优先级
                // new ThreadPoolExecutor.DiscardOldestPolicy() // 拒绝策略
                new ThreadPoolExecutor.AbortPolicy()
        );


        for (int i = 0; i < 3; i++) {
            int num = i;
            pool.submit(() -> {
                System.out.println("task " + num);
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        }

        // System.out.println("已经开启所有的子线程");
        // pool.shutdown(); // ! 必需 !
        // // 线程关闭后, 在提交任务, 会被拒绝.
        // pool.submit(() -> {
        //     System.out.println("shutdown 后提交");
        // }); // Lambda 表达式

        // System.out.println("shutdown()：启动一次顺序关闭，执行以前提交的任务，但不接受新任务。");
        // while(true){
        //     if(pool.isTerminated()){
        //         System.out.println("所有的子线程都结束了！");
        //         break;
        //     }
        //     try {
        //         Thread.sleep(1000);
        //     } catch (InterruptedException e) {
        //         e.printStackTrace();
        //     }
        // }
        //
        // System.out.println("eeeeeeeeeeeeeeeeeed");

    }


}
